<?php
class Request {
    private $params; // 合并后的所有参数（GET + POST）
    private $get;    // 仅GET参数
    private $post;   // 仅POST参数
    
    public function __construct() {
        // 解析GET参数
        $this->get = $this->parseGetData();
        
        // 解析POST参数（支持JSON和表单）
        $this->post = $this->parsePostData();
        
        // 合并参数：POST参数会覆盖同名的GET参数
        $this->params = array_merge($this->get, $this->post);
    }
    
    /**
     * 解析GET参数
     */
    private function parseGetData(): array {
        return $_GET ?? [];
    }
    
    /**
     * 解析POST参数（支持JSON和表单数据）
     */
    private function parsePostData(): array {
        $contentType = $_SERVER['CONTENT_TYPE'] ?? '';
        
        // 处理JSON格式（axios默认）
        if (strpos($contentType, 'application/json') !== false) {
            $json = file_get_contents('php://input');
            return json_decode($json, true) ?? [];
        }
        
        // 处理表单数据
        elseif (strpos($contentType, 'application/x-www-form-urlencoded') !== false ||
                strpos($contentType, 'multipart/form-data') !== false) {
            return $_POST ?? [];
        }
        
        // 其他格式返回空数组
        return [];
    }
    
    /**
     * 获取所有参数（GET + POST，POST优先）
     */
    public function all(): array {
        return $this->params;
    }
    
    /**
     * 获取指定参数（优先从POST获取，POST没有则从GET获取）
     * @param string $key 参数名
     * @param mixed $default 默认值
     */
    public function get(string $key, $default = null) {
        return $this->params[$key] ?? $default;
    }
    
    /**
     * 仅获取GET参数
     * @param string|null $key 可选参数名，为null时返回所有GET参数
     * @param mixed $default 默认值
     */
    public function getGet(?string $key = null, $default = null) {
        if ($key === null) {
            return $this->get;
        }
        return $this->get[$key] ?? $default;
    }
    
    /**
     * 仅获取POST参数
     * @param string|null $key 可选参数名，为null时返回所有POST参数
     * @param mixed $default 默认值
     */
    public function getPost(?string $key = null, $default = null) {
        if ($key === null) {
            return $this->post;
        }
        return $this->post[$key] ?? $default;
    }
    
    /**
     * 检查参数是否存在（无论GET还是POST）
     */
    public function has(string $key): bool {
        return isset($this->params[$key]);
    }
    
    /**
     * 检查GET参数是否存在
     */
    public function hasGet(string $key): bool {
        return isset($this->get[$key]);
    }
    
    /**
     * 检查POST参数是否存在
     */
    public function hasPost(string $key): bool {
        return isset($this->post[$key]);
    }
    
    /**
     * 获取原始JSON字符串（仅POST）
     */
    public function getRawJson(): string {
        return file_get_contents('php://input');
    }
    
    /**
     * 获取请求方法（GET/POST/PUT/DELETE等）
     */
    public function getMethod(): string {
        return $_SERVER['REQUEST_METHOD'] ?? 'GET';
    }
}
?>
    